var formidable = require('formidable');
var path = require('path');
var url = require('url');
var fs = require('fs');
var xlsx = require('node-xlsx');
var Course = require('../models/Course')
var Student = require('../models/Student')
var mongoose = require('mongoose')
var format = require('date-format')


function showAdminCourseIndex (req, res) {
    res.render("admin/course", {
        page: 'course'
    });
}

function showAdminCourseImport(req, res) {
    res.render("admin/course/import", {
        page: 'course'
    });
}

function doAdminCourseImport (req, res) {
    var form = new formidable.IncomingForm();
    form.uploadDir = './uploads/';
    form.keepExtensions = true;
    form.parse(req, function (err, fields, files) {
        // console.log(files);
        if (files.courseJSON.size === 0) {
            res.send("请上传文件");
            return
        }

        fs.readFile(files.courseJSON.path, function (err, data) {
            if (err) {
                // console.log('读取文件失败')
                res.send({result: -1})   //-1表示读取上传的文件失败
                return
            }
            // 先清空数据库原有的学生数据

            //判断读取的数据是否正确
            try {
                var courses_data = JSON.parse(data.toString()).courses
            }catch(e) {
                res.send('文件格式不正确，上传失败')
                return
            }

            //先创建一个暂时的表，避免删除的时候出错，因为上传会清空course，所以在删除时如果没发现这个表可能会出错，所以需要新建一个临时的表
            var cou = new Course({
                cid: '00000',
                cname: '00000'
            })
            cou.save(function (err) {
                if (err) {
                    res.send('数据库出现问题了')
                    return
                }
                //删除courses表，重新创建
                mongoose.connection.collection('courses').drop( function(err) {
                    if (err) {
                        console.log(err)
                        res.send('原有的数据删除失败，数据库出现问题了')
                        return
                    }

                    Course.create(courses_data, function (err) {
                        if (err) {
                            res.send({result: -2})   //-2表示数据库存储时候失败，可能是
                            return
                        }
                        makeStudentEmpty()
                        res.send(`
                            <div style="display: inline-block;background-color: #339933;padding: 10px 30px;color: #FFFFFF;border-radius: 6px">
                                你的Excel表已经上传成功，请回到课程清单中查看
                            </div>
                        `);
                    })

                });
            });

        })

    })
}

function getAllCourseInfo (req, res) {  //获得所有课程数据
    var query = url.parse(req.url, true).query;
    var sortType = query.sord === 'asc' ? 1 : -1;
    var keyword = query.keyword;
    var findFilter = {}
    //设置默认的排序字段
    if (query.sidx === undefined) {
        query.sidx = 'cid'   //默认按cid排序
        sortType = 1    //默认升序
    }
    if (keyword !== null && keyword !== undefined && keyword !== "") {
        var reg = new RegExp(keyword, 'g');
        findFilter = {
            $or: [
                { 'cid': reg },
                { 'cname': reg },
                { 'dayofweek': reg },
                { 'allow': reg },
                { 'teacher': reg }
            ]
        }
    }
    Course.count(findFilter, function (err, count) {
        // records共多少条记录
        // total共多少页
        // sortType排序方式
        var rows = parseInt(query.rows) || count   //默认一次显示全部记录
        // total, records, rows
        var total = Math.ceil(count / rows);
        var startRead = (parseInt(query.page) -1) * rows;
        Course.find(findFilter).sort({[query.sidx]: sortType}).skip(startRead).limit(rows).exec('find', function (err, result) {
            res.send({records: count, rows: result, total: total})
        })
    })
}

function setOneCourseInfo(req, res) {
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, files) {
        Course.find({ 'cid': fields.cid }, function (err, result) {
            if (err) {
                res.send({result: -1})   //-1表示查找出错
                return
            }
            var temp = result[0];
            var arr = []
            console.log(fields.allow.split(','));

            temp.cname = fields.cname

            arr.push(fields.dayofweek)
            temp.dayofweek = arr //dayofweek是一个数组

            temp.number = fields.number
            temp.allow = fields.allow.split(',')
            temp.teacher = fields.teacher
            temp.briefintro = fields.briefintro

            temp.save();
            res.send({ result: '1' })
        })
    })

}

function deleteCourse (req, res) {
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, fiels) {
        Course.remove({ 'cid': fields.sel_rows }, function (err, obj) {
            if (err) {
                res.send({ result: -1 })  //-1表示删除过程中发生了错误
            }else {
                res.send({ result: obj.n })
            }
        })
    })
}

function showAdminCourseAdd (req, res) {
    res.render('admin/course/add', {
        page: 'course'
    })
}

function doAdminCourseAdd (req, res) {
    //先查找是否有这个cid
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, fiels) {
        //再次检验表单的合法性

        for (var k in fields) {
            if (fields[k] === '') {
                res.json({ result: -1, resultData: '表单验证不通过，请正确提交你的表单数据' })
                return
            }
        }

        //判断课程号
        if (fields.cid.length !== 5) {
            res.json({ result: -2, resultData: '课程号不正确，请正确提交你的表单数据' })  //-2表示课程号不正确
            return
        }

        if (fields.allow.length === 0) {
            res.json({result: -3, resultData: '没有选年级，请正确提交你的表单数据' })   //-3表示没有选年级
            return
        }

        Course.find({ 'cid': fields.cid }, function (err, result) {
            if (result.length === 0) {
                var course = new Course({
                    cid: fields.cid,
                    cname: fields.cname,
                    number: fields.number,
                    allow: fields.allow,
                    teacher: fields.teacher,
                    dayofweek: fields.dayofweek,
                    briefintro: fields.briefintro
                    // students: []
                })
                course.save(function (err) {
                    if (err) {
                        res.json({ result: -4, resultData: '保存时数据库出错，请正确提交你的表单数据' })  //-4表示保存时出错
                        return
                    }
                    console.log('添加课程成功')
                    res.json({ result: 1 })
                });
            }
        })
    })
}

function findCourseExist (req, res) {
    // console.log(req.params.cid)
    if (req.params.cid.length !== 5) {
        res.json({ result: -2 })  //长度不正确
    }
    Course.find({ 'cid': req.params.cid }, function (err, result) {
        if (err) {
            res.json({ result: -1 })   // -1表示数据库已存在
        }else if (result.length !== 0) {
            res.json({ result: 1, rows: result[0] })   //1表示数据库已存在
        }else if (result.length === 0) {
            res.json({ result: 0 })  //0表示还没有该课程，可以添加
        }
    })
}

function makeStudentEmpty () {
    //清空所有学生的选课信息
    Student.find({}).select(['courses']).exec('find', function (err, stu) {
        // console.log(stu);
        stu.forEach(function (item) {
            item.courses = []
            item.save()
        })
        console.log('清空成功')
    })
}


module.exports = {
    showAdminCourseIndex,
    showAdminCourseImport,
    doAdminCourseImport,
    getAllCourseInfo,
    setOneCourseInfo,
    deleteCourse,
    showAdminCourseAdd,
    doAdminCourseAdd,
    findCourseExist
}